#ifndef ENGINE_H
#define ENGINE_H
#include <cstddef>
#include <SFML/Graphics/RenderWindow.hpp>
#include <iostream>
#include <deque>

/*
	Clase encargada de manejar las escenas,las crea, actualiza, y dibuja
*/

class Scene;

class Engine{

private:

	sf::RenderWindow window;//ventana de juego
	
	static Engine *instance;//única instancia de la clase

	std::deque<Scene *> sceneQueue;// cola de doble extremo que almacena las escenas

	Scene *currentScene, *sceneToDelete;//puntero a escena actual y a escena a eliminar
	
	bool mustUpdateCurrentScene;//indica si debe realizarse algún cambio de escena
	
	bool exit;//indica si debe cerrarse
	
	//Constructor
	Engine();


public:
	
	//Devuelve la única instacia de la clase (Singleton)
	static Engine &GetEngine();

	//Inicializa el motor de escenas
	void Init(unsigned w, unsigned h);
 
	//Ciclo principal del juego
	void Loop();
	
	//Cambia la escena por la pasada como parámetro
	void ChangeScene(Scene *s);

	//Deja la escena actual y comienza la nueva
	void PushScene(Scene *s);

	//Agrega una escena al final de la lista
	void AppendScene(Scene *s);

	
	//Quita la escena actual y toma la suspendida o la próxima
	void PopScene();
	
	//Termina la escena actual y sigue con la próxima
	void EndCurrentScene();

	//Toma el input de la ventana
	const sf::Input &GetInput() const;

	//Devuelve la ventana de juego
	sf::RenderWindow &GetRenderWindow();


	//Termina el Loop
	void Exit();





};

#endif
